#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author   : Moty
# @Time     : 2024/1/24 18:41
# @File     : dicUtil.py
# @Project  : jt808

def parse_terminal_param_reply_hex(hex_str):
    result = ""
    param_id_descriptions = {
        0x0001: "终端心跳发送间隔",
        0x0002: "TCP 消息应答超时时间",
        0x0003: "TCP 消息重传次数",
        0x0004: "UDP 消息应答超时时间",
        0x0005: "UDP 消息重传次数",
        0x0006: "SMS 消息应答超时时间",
        0x0007: "SMS 消息重传次数",
        0x0008 - 0x000F: "保留",
        0x0010: "主服务器 APN",
        0x0011: "主服务器无线通信拨号用户名",
        0x0012: "主服务器无线通信拨号密码",
        0x0013: "主服务器地址",
        0x0014: "备份服务器 APN",
        0x0015: "备份服务器无线通信拨号用户名",
        0x0016: "备份服务器无线通信拨号密码",
        0x0017: "备份服务器地址",
        0x0018: "服务器 TCP 端口",
        0x0019: "服务器 UDP 端口",
        0x001A: "道路运输证 IC 卡认证主服务器",
        0x001B: "道路运输证 IC 卡认证主服务器 TCP 端口",
        0x001C: "道路运输证 IC 卡认证主服务器 UDP 端口",
        0x001D: "道路运输证 IC 卡认证备份服务器",
        0x001E - 0x001F: "保留",
        0x0020: "位置汇报策略",
        0x0021: "位置汇报方案",
        0x0022: "驾驶员未登录汇报时间间隔",
        0x0023 - 0x0026: "保留",
        0x0027: "休眠时汇报时间间隔",
        0x0028: "紧急报警时汇报时间间隔",
        0x0029: "缺省时间汇报间隔",
        0x002A: "保留",
        0x002B: "保留",
        0x002C: "缺省距离汇报间隔",
        0x002D: "驾驶员未登录汇报距离间隔",
        0x002E: "休眠时汇报距离间隔",
        0x002F: "紧急报警时汇报距离间隔",
        0x0030: "拐点补传角度",
        0x0031: "电子围栏半径",
        0x0032 - 0x003F: "保留",
        0x0040: "监控平台电话号码",
        0x0041: "复位电话号码",
        0x0042: "恢复出厂设置电话号码",
        0x0043: "监控平台 SMS 电话号码",
        0x0044: "接收终端 SMS 文本报警号码",
        0x0045: "终端电话接听策略",  #
        0x0046: "每次最长通话时间",
        0x0047: "当月最长通话时间",
        0x0048: "监听电话号码",
        0x0049: "监管平台特权短信号码",
        0x004A-0x004F: "保留",
        0x0050: "报警屏蔽字",
        0x0051: "报警发送文本 SMS 开关",
        0x0052: "报警拍摄开关",
        0x0053: "报警拍摄存储标志",
        0x0054: "关键标志",
        0x0055: "最高速度",
        0x0056: "超速持续时间",
        0x0057: "连续驾驶时间门限",
        0x0058: "当天累计驾驶时间门限",
        0x0059: "最小休息时间",
        0x005A: "最长停车时间",
        0x005B: "超速报警预警差值",
        0x005C: "疲劳驾驶预警差值",
        0x005D: "碰撞报警参数设置",
        0x005E: "侧翻报警参数设置",
        0x005F-0x0063: "保留",
        0x0064: "定时拍照控制",
        0x0065: "定距拍照控制",
        0x0066-0x006F: "保留",
        0x0070: "图像/视频质量",
        0x0071: "亮度",
        0x0072: "对比度",
        0x0073: "饱和度",
        0x0074: "色度",
        0x0075-0x007F: "保留",
        0x0080: "车辆里程表读数",
        0x0081: "车辆所在的省域 ID",
        0x0082: "车辆所在的市域 ID",
        0x0083: "公安交通管理部门颁发的机动车号牌",
        0x0084: "车牌颜色",
        0x0090: "GNSS 定位模式",
        0x0091: "GNSS 波特率",
        0x0092: "GNSS 模块详细定位数据输出频率",
        0x0093: "GNSS 模块详细定位数据采集频率",
        0x0094: "GNSS 模块详细定位数据上传方式",
        0x0095: "GNSS 模块详细定位数据上传设置",
        0x0100: "CAN 总线通道 1 采集时间间隔",
        0x0101: "CAN 总线通道 1 上传时间间隔",
        0x0102: "CAN 总线通道 2 采集时间间隔",
        0x0103: "CAN 总线通道 2 上传时间间隔",
        0x0110: "CAN 总线 ID 单独采集设置",
        0x0111 - 0x01FF: "用于其他 CAN 总线 ID 单独采集设置",
        0xF000 - 0xFFFF: "用户自定义"
        # 添加更多的param_id和描述信息
    }

    while hex_str:
        # 取出每个TLV项
        tlv_id = hex_str[:4]
        hex_str = hex_str[4:]
        if len(tlv_id) != 4:
            return "无效的输入格式"

        # 解析TLV项中的ID、长度和值
        param_id = int(tlv_id, 16)
        # 获取长度字段L
        param_len_hex = hex_str[:2]
        hex_str = hex_str[2:]
        param_len = int(param_len_hex, 16)
        # 获取值字段V，并转为10进制
        param_value_hex = hex_str[:param_len * 2]
        param_value = int(param_value_hex, 16)
        hex_str = hex_str[param_len * 2:]

        # 根据param_id获取描述信息
        param_description = param_id_descriptions.get(param_id, f"未知ID({tlv_id})")
        # 构建格式化字符串
        result += f"{param_description}({tlv_id})  值：{param_value}；\n"

    return result